package com.tedu.api.io;

import org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

/**
 * IO： 传输数据    C/S 聊天室  Version
 * API上部分 ：字符串，包装类，日期类，集合
 * --------电脑三大件：CPU，  硬盘，  内存
 * API下部分：IO流   ---硬盘----文件数据传输
 *
 * 包位置：Java.io
 * File文件，文件夹类
 * 作用：用于表示操作系统中系统的一个文件或者“目录：文件夹”
 * 创建File对象-->有参构造器---<“路径+文件/文件名全称”
 *
 *
 * File类方法使用：
 * 1.查看该文件或者”文件夹：目录“的属性信息（名字，大小，是否存在）
 * 2.操作文件或者”文件夹：目录“（创建，删除）
 *3. 访问一个”文件夹：目录“的子项
 */
public class FileAPI {
    @Test
    public void testFile(){
   //创建文件夹
   //需求：当前API下创建文件---
//   File file=new File("D:\\java-api\\API\\src\\main" +
//           "\\java\\com\\tedu\\api\\io\\demo.txt");
    //相对路径---当前API下创建文件！   项目：Maven结构   main编写代码
    //FileAPI    相对于    API  项目下-->从src开始
    //操作系统：路径  \ 代表路径  文件上传到服务器  √
    //             / 代表路径  文件下载到本地
    // Java任何平台【操作系统】运行   统一路径属性
    //File.separator  静态属性：任何操作系统下转换成正确的路径表示方式
    File file=new File("src"+
            File.separator+"main"+
            File.separator+"java"+
            File.separator+"com"+
            File.separator+"tedu"+
            File.separator+"api"+
            File.separator+"io"+File.separator+"demo.txt");
   //判断文件是否存在的方法
   boolean b=file.exists();
        System.out.println("判断文件是否存在："+b);
    }


    /**
     * 查看文件或者文件夹属性信息：
     * getName()     返回值：String
     * 作用：获取文件的名字【注意：不看路径是否对错】
     * length()     返回值：long
     * 作用：返回当前文件的大小【字节量】
     * exists()     返回值：boolean
     * 作用：判断文件是否存在
     *
     */
    @Test
    public void testFileGL() throws IOException {
        //创建文件类--路径:Maven项目--相对路径
        //相对路径：./当前API项目下
        File file=new File("."+File.separator+"demo.txt");
        //打印file的路径
        System.out.println("打印file路径："+file.getCanonicalPath());
        //文件是否存在
        System.out.println("文件是否存在："+file.exists());
        //获取文件 /文件夹名字
        String name=file.getName();
        System.out.println("文件或者文件夹的名字："+name);
        //获取文件的"大小：字节量"
        long len=file.length();
        System.out.println("获取文件的大小[字节量]:"+len);
    }
    /**
     * 使用代码完成文件或者目录自动创建
     * creatNewFile()
     * 作用：创建一个新文件
     * 需求：使用代码完成 API项目文件夹下 自动创建test.txt文件
     */
    @Test
    public void testCreate() throws IOException {
        //创建文件类：路径+全称  ./test.txt
        File file=new File(""+File.separator+"test.txt");
        //判断  文件不存在--创建
        //           存在--不创建
        if(!file.exists()){
            System.out.println("文件不存在~~");
            file.createNewFile();
            System.out.println("文件已经创建~");
        }else{
            System.out.println("文件存在，别再创建了~");
        }
    }
    /**
     * delete()
     * 作用：删除文件或者文件夹
     * 需求：将API项目下的 test.txt  删除
     */
    @Test
    public void testDelete(){
        //创建File类      路径：./test.txt   ./不写代表 当前项目
        File file=new File("test.txt");
        //判断 如果文件 存在-->删除
        //           不存在-->删除
        if(file.exists()){
            System.out.println("文件存在");
            file.delete();
            System.out.println("文件删除~~");

        }else{
            System.out.println("文件已经删除啦~~");
        }

    }
    /**
     * mkdir()
     * 作用：创建一个文件夹
     * 需求：在API项目下 创建一个文件夹 demo
     *
     * 多层文件夹：demo/abc/bcd
     * mkdirs()
     * 作用：创建多层文件夹
     */
     @Test
    public void testMkdir(){
         //创建File文件/文件夹--->创建demo文件夹 /abc /bcd
         File file=new File("demo" +
                 ""+File.separator+"abc"
                   +File.separator+"bcd");
         //判断 如果文件不存在---创建文件夹
         //            存在---不创建
         if(!file.exists()){
             System.out.println("判断不存在");
             file.mkdirs();
             System.out.println("文件夹创建");
         }else{
             System.out.println("别创建了");
         }
     }
    //作业1：多层文件夹demo/abc/bcd(不能用递归)
    //提示：构造器new File(File parent,"子路径")
    //     不需要exist判断
    //思路：找到每一级路径【bcd删除完毕--abc删除完毕-demo】
      @Test
    public void testHomeWork1(){
         //1.创建多层文件夹 demo/abc/bcd
           File parent=new File("demo");
           //构造器使用(父级路径,子集路径)  ：父级路径/子集路径
           File child1=new File(parent,"abc");
           File child2=new File(child1,"bcd");

           child2.delete();  //删除bcd
          child1.delete();  //删除abc
          parent.delete(); //删除demo


          //作业2：提示--创建FileFilter接口--匿名内部类
 //         FileFilter ff=new FileFilter() {
//
//              public boolean accept(File pathname) {
//                  return false;
//              }
//          };

          parent.listFiles(new FileFilter() {

              public boolean accept(File pathname) {
                  return false;
              }
          });
      }


    /**
     * 访问文件夹-->所有子项【文件夹和文件】
     * listFiles()    返回值：File[]  文件数组
     *  作用:获取文件夹的所有子项【包含文件夹和文件】
     *  isFile()        返回值：boolean
     *  作用：判断是否为文件，是 true
     *                  不是 false
     * isDirectory 返回值：boolean
     * 作用：判断是否为文件夹，是文件夹true,反之...
     * 需求：获取API项目下 所有的文件夹文字
     *
      */
    @Test
    public void testlistFiles() throws IOException {
        //获取API项目
     File file=new File("."+File.separator);
        System.out.println(file.getCanonicalFile());
        //过滤：3个文件，4个文件夹
        if (file.isDirectory()){}
        //获取到所有的文件夹
        File[] dir=file.listFiles();
        //遍历所有的文件夹名字
        for (int i=0;i<dir.length;i++){     // i 拿到所有下标
            //打印文件夹名字
            System.out.println(dir[i].getName());

        }
    }
}
